perm filename G1TO5[KID,KMC] blob sn#122899 filedate 1974-11-15 generic text, type T, neo UTF8
TITLE G1TO5
;THE PART OF THE NEW KIDS PROGRAM COMMON TO MANY GAMES.
EXTERNAL MAINLP,ALFBET,DPINIT,PDPGET,CLEAR,SHOW,AIVECT,CHINIT
EXTERNAL LV2,KILL,TYOPTR,TIKCNT,DDRREL,DMDDIR,SPEAK
INTERNAL DOTHNG
X1←6
X2 ← X1+1
X3 ← X2+1
X4 ← X3+1
X5 ← X4+1
X6 ← X5+1
P←17
A←13	;SAME AS X6
B←14
C←15

LCWP:	0	;Last Command Wrote on some P.o.g.
FLOOP:	0

DOTHNG:	LSHC	X1,-1
	LSH	X2,-=35		;PRY OFF LOW BIT.
	MOVE	0,ALFBET(X1)	;TABLE ENTRY
	JUMPN	X2,.+2
	LSH	0,-=18		;LEFT HALF OF ENTRY REQUIRED.
	HRRZ	X2,0
	JUMPE	X2,MAINLP	;IF NO SEQUENCES FOR THAT CHAR IGNORE IT

	;THE LIST OF ALTERNATIVE SEQUENCES IS POINTED AT BY X2
	MOVE	X3,0(X2)	;NO. OF ALTERNATIVES.
	MOVE	X4,X2		;A MOVING POINTER FOR ROTATING.
	MOVE 	X5,1(X4)	;FIRST ENTRY IN LIST
ROTLP:	SOSN	X3		;FEWER ALTERNATIVES LEFT
	JRST	ROTLPX		;ESCAPE LOOP
	AOSE	X4		;MOVE THE POINTER
	MOVE	X6,1(X4)	;GET SOMETHING OUT OF THIS CELL
	MOVEM	X5,1(X4)	;BUT REPLACE IT
	MOVE	X5,X6		;KEEP LATEST IN X5
	JRST	ROTLP
ROTLPX:	MOVEM	X5,1(X2)	;PUT LAST ELT IN 1ST CELL OF LIST
	;THE LIST OF ALTERNATIVES IS ROTATED WHEN CONTROL FALLS THRU

	;NOW 1ST ALTERNATIVE IS A POINTER TO A BLOCK OF COMMANDS
	MOVE	X4,1(X2)	;FIRST ALTERNATIVE
CMDLP:	MOVE	X5,0(X4)	;NEXT COMMAND
	MOVE	0,TIKCNT	;NO. OF TIKS BEFORE COMMAND READY
	JUMPLE	0,.+4
	MOVEI	0,0
	CALL	[SIXBIT /SLEEP/]
	JRST	CMDLP

	ADDI	X4,1		;BUMP COMMAND POINTER


	LSHC	X5,-36		;ISOLATE COMMAND CHARACTER
				;X6 CONTAINS ARGUMENT OF THE COMMAND
	SUBI	X5,41		;ALL CMDS. ARE LETTERS SO MAKE A ZERO.
 	JUMPGE	X5,.+5		;NO CODE SHOULD BE < ZERO

	MOVEI	A,0
	MOVEI	B,=2561
	PUSHJ	P,DPINIT	;DPINIT(0,2561)
	HALT			;ERROR MESSAGE NOT APPROP. - USE RAID
	CAILE	X5,22		;COMMANDS PAST S ARE ILLEGAL.
	JRST[	MOVEI	A,0
		MOVEI	B,=2561
		PUSHJ	P,DPINIT	;DPINIT(0,2561)
		HALT			];USE RAID HERE
	JRST	.+1(X5)		;BRANCH USING FOLOWING JUMP TABLE
	JRST	CMDA		;SHOW FILE [X6] ON POG1
	JRST	CMDB		;SHOW FILE [X6] ON POG2
	JRST	CMDC		;SHOW FILE [X6] ON POG3
	JRST	CMDD		;SHOW FILE [@X6] ON POG1
	JRST	CMDE		;SHOW FILE [@X6] ON POG2
	JRST	CMDF		;SHOW FILE [@X6] ON POG3
	JRST	CMDG		;SAY FILE [X6]
	JRST	CMDH		;SAY FILE [@X6]
	JRST	CMDI		;WAIT [X6] TICKS
	JRST	CMDJ		;SAY FILE [X6] AND QUIT
	JRST	CMDK		;SAY FILE [@X6] AND QUIT
	JRST	CMDL		;SHOW AND SAY FILE [X6]
	JRST	CMDM		;SHOW AND SAY FILE [@X6]
	JRST	CMDN		;SHOW AND SAY FILE [X6] AND QUIT
	JRST	CMDO		;SHOW AND SAY FILE [@X6] AND QUIT
	JRST	CMDP		;SHOW TEXT [@X6] ON TOP POG2
	JRST	CMDQ		;SHOW TEXT [@X6] ON CENTER POG2
	JRST	CMDR		;CLEAR POG[X6]
	JRST	CMDS		;LAST OF THE COMMANDS.
	JRST	CMD0		;DISASTER
	JRST	CMD0		;DISASTER

CMD0:	MOVEI	A,0
	MOVEI	B,=2561
	PUSHJ	P,DPINIT	;DPINIT(0,2561)
	HALT

CMDA:	;SHOW THE DISPLAY FILE WHOSE NAME IS IN X6 ON P1
	MOVE	0,LCWP
	JUMPN	0,TIKB
	SETOM	LCWP		;LATEST COMMAND WROTE A PICTURE
	MOVE	A,X6		;S/R EXPECTS FILENAME IN REG A
	PUSHJ	P,PDPGET	;GET THE DPY FILE
	JUMPN	A,CMDLP
	MOVEI	A,1		; INDICATE P.O.G. 1
	PUSHJ	P,SHOW
	PUSHJ	P,CLEAR		;EMPTY THE BUFFER
	JRST	CMDLP


CMDB:	;SHOW THE DISPLAY FILE WHOSE NAME IS IN X6 ON P2
	MOVE	0,LCWP
	JUMPN	0,TIKB
	SETOM	LCWP		;LATEST COMMAND WROTE A PICTURE
	MOVE	A,X6		;S/R EXPECTS FILENAME IN REG A
	PUSHJ	P,PDPGET	;GET THE DPY FILE
	JUMPN	A,CMDLP
	MOVEI	A,2		; INDICATE P.O.G. 2
	PUSHJ	P,SHOW
	PUSHJ	P,CLEAR		;EMPTY THE BUFFER
	JRST	CMDLP


CMDC:	;SHOW THE DISPLAY FILE WHOSE NAME IS IN X6 ON P3
	MOVE	0,LCWP
	JUMPN	0,TIKB
	SETOM	LCWP		;LATEST COMMAND WROTE A PICTURE
	MOVE	A,X6		;S/R EXPECTS FILENAME IN REG A
	PUSHJ	P,PDPGET	;GET THE DPY FILE
	JUMPN	A,CMDLP
	MOVEI	A,3		; INDICATE P.O.G. 3
	PUSHJ	P,SHOW
	PUSHJ	P,CLEAR		;EMPTY THE BUFFER
	JRST	CMDLP


CMDD:	;SHOW THE FILE POINTED TO BY X6 ON POG1
	LSH	X6,-6		;AN ADDRESS
	MOVE	X6,0(X6)	;THE 6 CHAR NAME.
	JRST	CMDA


CMDE:	;SHOW THE FILE POINTED TO BY X6 ON POG2
	LSH	X6,-6		;ADDRESS OF A NAME
	MOVE	X6,0(X6)	;THE ACTUAL NAME
	JRST	CMDB


CMDF:	;SHOW THE FILE POINTED TO BY X6 ON POG3
	LSH	X6,-6		;ADDRESS OF THE NAME
	MOVE	X6,0(X6)	;THE NAME ITSELF
	JRST	CMDC


CMDG:	;SAY THE FILE WHOSE NAME IS IN X6
	MOVE	A,X6		;FILE NAME
	PUSHJ	P,DMDDIR
	JUMPN	A,CMDLP
	PUSHJ	P,SPEAK
	JUMPN	A,CMDLP
	SETZM	LCWP		;LAST COMMAND WAS SOUND
	PUSHJ	P,CLEAR		;UNBELIEVABLE.
	JRST	CMDLP		;DO NEXT COMMAND


CMDH:	;SAY THE FILE WHOSE NAME IS POINTED TO BY X6
	LSH	X6,-6		;GET ADDRESS IN BOTTOM
	MOVE	X6,0(X6)	;GET THE FILE NAME
	JRST	CMDG


CMDI:	;WAIT THE NO. OF TIKS GIVEN IN X6
	LSH	X6,-6		;MOVE INTEGER TO BOTTOM OF WORD.
	SETZM	LCWP		;PRETEND LAST COMMAND WAS SOUND
	MOVEM	X6,TIKCNT
	SUBI	X4,1
	JRST	CMDLP


CMDJ:	;SAME AS CMDG AND THEN QUIT.
	MOVEI	X4,QUITCD
	JRST	CMDG


CMDK:	;SAME AS CMDH AND THEN QUIT.
	MOVEI	X4,QUITCD
	JRST	CMDH


CMDL:	;SHOW (POG1) AND SAY FILE WHOSE NAME IS IN X6
	;IF FLOOP IS ZERO THEN SHOW PIC AND SET FLOOP=-1
	MOVE	FLOOP
	JUMPN	CMDL2
	SETOM	FLOOP
	SUBI	X4,1
	JRST	CMDA	;SHOW FILE ON POG1
CMDL2:	SETZM	FLOOP
	JRST	CMDG	;SAY FILE.


CMDM:	;SAME AS CMDL EXCEPT ADDRESS OF FILESNAME IS IN X6
	LSH	X6,-6	;GET ADDRESS
	MOVE	X6,0(X6);FILE NAME
	JRST	CMDL


CMDN:	;SHOW ON POG1, SAY AND QUIT WITH FILE NAME IN X6.
	MOVE	FLOOP
	JUMPN	CMDN2
	SETOM	FLOOP
	SUBI	X4,1
	JRST	CMDA	;SHOW THE FILE ON POG1
CMDN2:	SETZM	FLOOP
	MOVEI	X4,QUITCD;POINT TO A QUIT ORDER.
	JRST	CMDG	;SAY FILE.


CMDO:	;SAME AS CMDN EXCEPT FILENAME IS ADDRESSED BY X6
	LSH	X6,-6
	MOVE	X6,0(X6);GET FILE NAME
	JRST	CMDN


CMDP:	;SHOW THE TEXT POINTED TO BY X6 ON THE TOP OF POG2.
	MOVE	0,LCWP
	JUMPN	0,TIKB
	SETOM	LCWP		;LATEST COMMAND WROTE A PICTURE
	LSH	X6,-6
	MOVE	X5,X6
	PUSHJ	P,CLEAR
	MOVEI	A,-=500
	MOVEI	B,=500
	PUSHJ	P,AIVECT	;AIVECT(-500,600)
	MOVEI	A,0
	MOVEI	B,0
	MOVEI	C,46
	MOVEI	0,7
	DPB	0,[POINT 3,C,27]
	PUSHJ	P,LV2		;GVECT(0,0,46,7,0)
	MOVEI	A,7
	MOVEI	B,=1000
	MOVEI	C,-=500
	PUSHJ	P,CHINIT
	PUSHJ	P,COPTXT
	MOVEI	A,2
	PUSHJ	P,SHOW
	JRST	CMDLP


CMDQ:	;SHOW THE TEXT POINTED TO BY X6 AT THE MIDDLE OF POG2.
	MOVE	0,LCWP
	JUMPN	0,TIKB
	SETOM	LCWP		;LATEST COMMAND WROTE A PICTURE
	LSH	X6,-6
	MOVE	X5,X6
	PUSHJ	P,CLEAR
	MOVEI	A,-=500
	MOVEI	B,0
	PUSHJ	P,AIVECT	;AIVECT(-500,0)
	MOVEI	A,0
	MOVEI	B,0
	MOVEI	C,46
	MOVEI	0,7
	DPB	0,[POINT 3,C,27]
	PUSHJ	P,LV2		;GVECT(0,0,46,7,0)
	MOVEI	A,7
	MOVEI	B,=1000
	MOVEI	C,-=500		
	PUSHJ	P,CHINIT	;CHINIT(7,1000,-500)
	PUSHJ	P,COPTXT
	MOVEI	A,2
	PUSHJ	P,SHOW
	JRST	CMDLP

CMDR:	;KILL POG WHOSE NUMBER IS GIVEN IN X6
	MOVE	A,X6
	PUSHJ	P,KILL
	JRST	CMDLP

CMDS:	;END OF THIS SEQUENCE OF COMMANDS
	MOVE	0,LCWP		;TEST IF TIME MUST RUN OUT
	JUMPN	0,TIKA		;JUMP IF LAST COMMAND WROTE ON GLASS
	JRST	MAINLP		;GET ANOTHER CHARACTER ETC.


TIKA:	MOVEI	X6,=40
 	JRST	CMDI+1

TIKB:	MOVEI	X6,=5
 	JRST	CMDI+1


COPTXT:	;THE ASCIZ STRING POINTED TO BY X5 IS FOR DISPLAY
	HLL	X5,[POINT 7,0]
COP1:	ILDB	X6,X5
	JUMPE	X6,COP2
	CAIN	X6,26		;TEST FOR A ⊗
	JRST	COP3
	IDPB	X6,TYOPTR
	JRST	COP1
COP2:	POPJ	P,
COP3:	MOVEI	X6,15		;CARRIAGE RETURN
	IDPB	X6,TYOPTR
	MOVEI	X6,12		;LINE FEED
	IDPB	X6,TYOPTR
	JRST	COP1


QUITCD:	SIXBIT	/S/		;A QUIT COMMAND.
JNAME:	SIXBIT	/GAME/
	SIXBIT	/DMP/		;NO MODE BITS
	XWD	7,0		;GAMES WILL BE 7K PROGRAMS
	0			;ZERO AS PROJECT-PROGRAMMER NAME

END